# glob模式

在学习gulp的过程中,gulp使用了被称作为glob的文件匹配模式。

接下来我们认识下什么是glob模式。

在计算机编程中,特别是类Unix环境,glob模式通过通配符来匹配文件名。例如:Unix命令,将所有以扩展名为 .txt 的文件从当前目录拷贝到 textfiles 目录。

mv *.txt textfiles/
1

这里 * 是一个匹配任意数量字符基本通配符,*.txt就表示一个glob模式。另一个通用的通配符是 ?,它表示任意一个字符。

# 常用的通配符是 *, ?, […]

通配符 描述 例子 匹配 不匹配
* 匹配任意数量的字符包括空字符 Law* Law, Laws, or Lawyer
*Law* Law, GrokLaw, or Lawyer.
? 匹配任意一个字符 ?at Cat, cat, Bat or bat at
[abc] 匹配任意一个包含的字符 [CB]at Cat or Bat cat or bat
[a-z] 匹配任意一个给定范围的字符 Letter[0-9] Letter0, Letter1 etc. Letters or Letter

注意,在所有以上例子中路径分隔符(unix的 / ,windows的 \ )都不会被匹配。

# 在Linux和POSIX系统中 […] 有以下两个扩展

通配符 描述 例子 匹配 不匹配
[!abc] 不匹配任意一个包含的字符 [!C]at Bat, bat, or cat Cat
[!a-z] 不匹配任意一个给定范围的字符 Letter[!3-5] Letter1, Letter2 etc. Letter3, Letter4 or Letter5

# 与正则的比较

Glob的通配符 等价正则的表达式
? .
* .*

Glob尝试匹配整个字符串,例如:

S*.DOC 将匹配 S.DOCSA.DOC ,但不匹配 POST.DOCSURREY.DOCKS

正则只匹配子串除非使用 ^$ 。所以 S*.DOC 的等价正则是 ^S.*\.DOC$

# node glob对常用通配符又做了一些扩展

通配符 描述 例子 匹配 不匹配
** 匹配任意数量的字符包括空字符(包括路径分隔符) **/*.js /a/b/c.js
!(pattern|pattern) 匹配除了()内以外的pattern !(abc|bcd) aaa,bbb abc.bcd
?(pattern|pattern) 匹配至多一个()内的pattern ?(abc|bcd) abc bbb
+(pattern|pattern) 匹配至少一个()内的pattern +(abc|bcd) abc bbb
*(pattern|pattern) 匹配任意个()内的pattern *(abc|bcd) abc bbb
@(pattern|pattern) 精确匹配()内的其中一个pattern @(abc|bcd) abc abd